EV Sales (2020-2024) Delhi, India¶
Data downloaded from Vahan4Dashboard and saved as excel file by Manufacturer. Spreadsheet stored in Folder: Data
| S No | Maker | 2024 | 2023 | 2022 | 2021 | 2020 | TOTAL | |
|---|---|---|---|---|---|---|---|---|
| 0 | 148 | OLA ELECTRIC TECHNOLOGIES PVT LTD | 11650 | 13180 | 6531 | 0 | 0 | 31361 |
| 1 | 227 | YC ELECTRIC VEHICLE | 5997 | 6546 | 4422 | 2654 | 1823 | 21442 |
| 2 | 205 | TVS MOTOR COMPANY LTD | 4116 | 7531 | 3165 | 823 | 0 | 15635 |
| 3 | 89 | HERO ELECTRIC VEHICLES PVT. LTD | 61 | 1199 | 9916 | 3028 | 264 | 14468 |
| 4 | 17 | ATHER ENERGY PVT LTD | 2215 | 3806 | 2773 | 744 | 0 | 9538 |
Index(['S_No', 'Maker', '2024', '2023', '2022', '2021', '2020', 'Total'], dtype='object')
C:\Users\risha\AppData\Local\Temp\ipykernel_50792\2961712208.py:18: FutureWarning: Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect. sns.barplot(data=df_top_sales, x='Maker', y='Total', palette=light_palette) C:\Users\risha\AppData\Local\Temp\ipykernel_50792\2961712208.py:18: UserWarning: The palette list has fewer values (10) than needed (20) and will cycle, which may produce an uninterpretable plot. sns.barplot(data=df_top_sales, x='Maker', y='Total', palette=light_palette)
Analysis of all installed charging station infrastructure in Delhi¶
RUN ALL CELLS TO PRODUCE A HEATMAP OF ALL CHARGING STATIONS IN DELHI
Data successfully fetched and saved to 'battery_swapping_stations.json'
Result structure:
Name Latitude Longitude 0 Platinum-Motors-Chandigarh 30.711684 76.806394 1 Chandigarh-Zirkapur 30.676800 76.809480 2 GMP Motors Chandigarh 30.702948 76.802712 3 Chandigarh-PGI-Manimajra 30.716930 76.838000 4 Chandigarh-Elante-Mall 30.708830 76.804480
| Name | Latitude | Longitude | |
|---|---|---|---|
| 0 | Platinum-Motors-Chandigarh | 30.711684 | 76.806394 |
| 1 | Chandigarh-Zirkapur | 30.676800 | 76.809480 |
| 2 | GMP Motors Chandigarh | 30.702948 | 76.802712 |
| 3 | Chandigarh-PGI-Manimajra | 30.716930 | 76.838000 |
| 4 | Chandigarh-Elante-Mall | 30.708830 | 76.804480 |
Battery swapping stations - source: Sun Mobility¶
ev.delhi.gov.in Data¶
Getting Charging stations¶
address postal_code capacity \
0 175, Patparganj Industrial Area, Patparganj 110092 3.3kw
1 A-1/1, Hardev Puri, 100 ft Road, Nathu Colony ... 110025 3.3kw
2 Plot no. 1-A, Shiv vihar, Nangloi 110019 3.3kw
3 M block Market Gearter Kailash 1 110041 3.3kw
4 Shop No-48, NH-5, NIT, Faridabad 110052 3.3kw
.. ... ... ...
886 Shop No-1, Rajeev Vihar, Khora Colony, Sector-... 201301
887 Shop No-1, Sector-4, Near Ek Mutri Gol Chakkar... 201301
888 House No-93, Shop No-PVT-1, Ground Floor, Bloc... 110085
889 Shop No-RZ-62-K/6A, Ground Flour, Vashist Park... 110046
890 Shop No-B-308, First Floor, Madanpur Khadar Ex... 110076
city close cost_per_unit country latitude longitude \
0 New Delhi 21:00:00 15 India 28.642213 77.314837
1 New Delhi 21:00:00 15 India 28.689606 77.298775
2 New Delhi 21:00:00 15 India 28.661666 77.061585
3 New Delhi 21:00:00 15 India 28.550284 77.235053
4 New Delhi 21:00:00 15 India 28.405363 77.305530
.. ... ... ... ... ... ...
886 New Delhi 20:00:00 INDIA
887 New Delhi 20:00:00 INDIA
888 New Delhi 20:00:00 INDIA
889 New Delhi 20:00:00 INDIA
890 New Delhi 20:00:00 INDIA
open ... charger_type if_battery_swap_station,_no._of_dockets \
0 08:00:00 ... LEV AC nil
1 09:00:00 ... LEV AC nil
2 10:00:00 ... LEV AC nil
3 11:00:00 ... LEV AC nil
4 12:00:00 ... LEV AC nil
.. ... ... ... ...
886 08:00:00 ...
887 08:00:00 ...
888 08:00:00 ...
889 08:00:00 ...
890 08:00:00 ...
id vendor charging_type contact_number name \
0 S01 Massive Mobility Charging
1 S02 Massive Mobility Charging
2 S03 Massive Mobility Charging
3 S04 Massive Mobility Charging
4 S05 Massive Mobility Charging
.. ... ... ... ... ...
886 CNOI0006 Echargeup Battery swapping
887 CNOI0007 Echargeup Battery swapping
888 CDEL00116 Echargeup Battery swapping
889 CDEL00117 Echargeup Battery swapping
890 CDEL00118 Echargeup Battery swapping
coordinates timing \
0 {'latitude': '28.642213', 'longitude': '77.314... 08:00:00 - 21:00:00
1 {'latitude': '28.689606', 'longitude': '77.298... 09:00:00 - 21:00:00
2 {'latitude': '28.661666', 'longitude': '77.061... 10:00:00 - 21:00:00
3 {'latitude': '28.550284', 'longitude': '77.235... 11:00:00 - 21:00:00
4 {'latitude': '28.405363', 'longitude': '77.305... 12:00:00 - 21:00:00
.. ... ...
886 {'latitude': '', 'longitude': ''} 08:00:00 - 20:00:00
887 {'latitude': '', 'longitude': ''} 08:00:00 - 20:00:00
888 {'latitude': '', 'longitude': ''} 08:00:00 - 20:00:00
889 {'latitude': '', 'longitude': ''} 08:00:00 - 20:00:00
890 {'latitude': '', 'longitude': ''} 08:00:00 - 20:00:00
no_of_chargers
0 2
1 1
2 10
3 1
4 1
.. ...
886 10
887 10
888 10
889 10
890 10
[891 rows x 23 columns]
Total charging stations in source: 891
Charging stations obtained in DataFrame: 891
Number of non-nil entries: 21
(1442, 24)
Index(['address', 'postal_code', 'capacity', 'city', 'close', 'cost_per_unit',
'country', 'latitude', 'longitude', 'open', 'payment_modes', 'staff',
'available', 'charger_type', 'if_battery_swap_station,_no._of_dockets',
'id', 'vendor', 'charging_type', 'contact_number', 'name',
'coordinates', 'timing', 'no_of_chargers', 'station_type'],
dtype='object')
array([2, 1, 10, 5, 3, 36, 18, 26, 34, 4, 20, 7, 12, 24, 6, 16, 8, 44, 14,
30, 42, 40, 50, 28, 46, 22, 32, <NA>], dtype=object)
Visualizing all charging infrastructure (Charging Stations and Battery Swapping Stations)
Total stations in Delhi area: 1173
address postal_code capacity \
0 175, Patparganj Industrial Area, Patparganj 110092.0 3.3kw
1 A-1/1, Hardev Puri, 100 ft Road, Nathu Colony ... 110025.0 3.3kw
2 Plot no. 1-A, Shiv vihar, Nangloi 110019.0 3.3kw
3 M block Market Gearter Kailash 1 110041.0 3.3kw
4 Shop No-48, NH-5, NIT, Faridabad 110052.0 3.3kw
city close cost_per_unit country latitude longitude open \
0 New Delhi 21:00:00 15.0 India 28.642213 77.314837 08:00:00
1 New Delhi 21:00:00 15.0 India 28.689606 77.298775 09:00:00
2 New Delhi 21:00:00 15.0 India 28.661666 77.061585 10:00:00
3 New Delhi 21:00:00 15.0 India 28.550284 77.235053 11:00:00
4 New Delhi 21:00:00 15.0 India 28.405363 77.305530 12:00:00
... if_battery_swap_station,_no._of_dockets id vendor \
0 ... nil S01 Massive Mobility
1 ... nil S02 Massive Mobility
2 ... nil S03 Massive Mobility
3 ... nil S04 Massive Mobility
4 ... nil S05 Massive Mobility
charging_type contact_number name \
0 Charging NaN NaN
1 Charging NaN NaN
2 Charging NaN NaN
3 Charging NaN NaN
4 Charging NaN NaN
coordinates timing \
0 {'latitude': '28.642213', 'longitude': '77.314... 08:00:00 - 21:00:00
1 {'latitude': '28.689606', 'longitude': '77.298... 09:00:00 - 21:00:00
2 {'latitude': '28.661666', 'longitude': '77.061... 10:00:00 - 21:00:00
3 {'latitude': '28.550284', 'longitude': '77.235... 11:00:00 - 21:00:00
4 {'latitude': '28.405363', 'longitude': '77.305... 12:00:00 - 21:00:00
no_of_chargers station_type
0 2.0 Charging Station
1 1.0 Charging Station
2 10.0 Charging Station
3 1.0 Charging Station
4 1.0 Charging Station
[5 rows x 24 columns]
station_type Charging Station 737 Battery Swapping Station 436 Name: count, dtype: int64
HEATMAP¶
C:\Users\risha\AppData\Local\Temp\ipykernel_50792\4172852508.py:14: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df_delhi['cluster'] = dbscan.labels_
Make this Notebook Trusted to load map: File -> Trust Notebook
array([ 0, 1, 2, -1, 3, 25, 4, 5, 6, 7, 15, 8, 14, 16, 11, 9, 10,
12, 13, 17, 28, 18, 19, 20, 21, 22, 23, 24, 26, 27, 29, 30],
dtype=int64)
C:\Users\risha\AppData\Local\Temp\ipykernel_50792\1633298464.py:12: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df_delhi['cluster'] = dbscan.labels_
Make this Notebook Trusted to load map: File -> Trust Notebook
Biggest Charging station clusters in Delhi¶
C:\Users\risha\AppData\Local\Temp\ipykernel_50792\2685989848.py:34: FutureWarning: Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect. sns.countplot(x='cluster_label', data=df_clusters, palette='viridis', order=sorted(df_clusters['cluster_label'].unique()))
Maps have been saved as 'delhi_station_clusters_map.html' and 'delhi_station_density_heatmap.html'.
Further Analysis¶
using station specifications like - 'capacity','cpst_per_unit', and 'charger_type'
[ 0. 15. 7. 2.2 3.3 22. 142. 50. 48. 8. 20. 12. 40. 32. 16. 88. 24. 4. 28. 60. 84. 80. 100. 72. 56. 36. 92. 44. 64. ] [ 15. 20. 2. 5. 10. 12. 30. 25. 40. 50. 100. 70. 1. 45. 200. 13. 350. 80. 18. 90. 9.5] ['AC' 'Unknown' 'DC']
C:\Users\risha\AppData\Local\Temp\ipykernel_50792\2831129267.py:19: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.
The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.
For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.
df_delhi_clean['cost_per_unit'].fillna(median_cost, inplace=True)
C:\Users\risha\AppData\Local\Temp\ipykernel_50792\2831129267.py:34: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.
The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.
For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.
df_delhi_clean['capacity'].fillna(0, inplace=True)
Charger Type Distribution Map
Make this Notebook Trusted to load map: File -> Trust Notebook
Cost Per Unit
Charging Capacity
Make this Notebook Trusted to load map: File -> Trust Notebook